package com.xxxx.mytest.funs

/**
 * @program: day0303
 * @description: 尽信书，则不如无书
 * @author: CoreDao
 * @create: 2021-03-03 08:45
 **/

object funs {

  def main(args: Array[String]): Unit = {

    /**
     * f函数表示：接收两个Int类型的参数，返回一个int类型的函数
     * 函数：看什么时候被调用
     * 参数是函数
     * @param a
     * @param f
     * @return
     */
    def f7(a:Int,f:(Int,Int)=>Int)={
      val result = f(1, 2)
      a*result
    }
    def f8(a:Int,b:Int):Int=a+b
    println(f7(1, f8))

    val sum: (Int, Int) => Int = (a:Int, b:Int)=>a+b

    //用匿名函数写，因为重要的是body
    println(f7(1, (a:Int,b:Int)=>a+b))
    println(f7(1, sum))

    /**
     * 返回值是函数
     * @param a
     * @param b
     * @return
     */
    def f9(a:Int,b:Int):(String,String)=>String = {
      def f10(c:String,d:String):String={
        a + b + c + d
      }
      //此处不要调用
      f10
    }
    val function: (String, String) => String = f9(1,2)
    val str: String = function("1", "2")
    println(str)
    println(f9(2, 3)("2", "3"))

    /**
     * 参数和返回值都是函数
     * @param f
     * @return
     */
    def f11(f:(Int,Int)=>Int):(Int,Int)=>Int={
      f
    }
    println(f11((a: Int, b: Int) => a + b)(10, 20))
    //使用下划线作为通配符需要注意，此变量只被使用到了一次，在公司一般不这么写
    println(f11(_+_)(10, 20))

  }


}
